package mc.web;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import mc.bus.IBazaPacjentow;
import mc.domain.Adres;
import mc.domain.Pacjent;
import mc.util.MedcenterRequestUtil;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.beans.propertyeditors.StringTrimmerEditor;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.validation.BindException;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;
import org.apache.commons.lang.StringUtils;

public class PacjentForm extends SimpleFormController {

	private final Log logger = LogFactory.getLog(getClass());	
	
	/**
	 * Rzutowanie na interfejs - umożliwia wykorzystanie obiektow proxy - dodane po
	 * zastosowaniu transakcyjności
	 */
	private IBazaPacjentow bazapacjentow;
	private ResourceBundleMessageSource messagesource;


	@Override
	protected Object formBackingObject(HttpServletRequest request) throws Exception {

		Pacjent p=new Pacjent();
		int id=-1;
		
		try{
			id=(Integer.parseInt((request.getParameter("id")).toString()));
			//jesli w adresie podany byl id - pacjent zaciagniety z bazy
			if((id>0)&&(request.getParameter("submit")==null))
				p=bazapacjentow.getFullPacjentById(id);
		}
		
		catch(Exception e){
			logger.error("Nie podano prawidlowego id pacjenta");
			logger.error(e);
		}
		
		return p==null ? new Pacjent() : p;
	}
	
	@Override
	protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
		
		SimpleDateFormat dateFormat = new SimpleDateFormat(messagesource.getMessage("data.format", null, null));
	    dateFormat.setLenient(false);
	    binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
	    //StringTrimmerEditor bo w innym wypadku gdy pole w formularzu jest puste to odpowiadajace
	    //mu pole w obiekcie ma wartosc null a nie jest pustym stringiem (pusty string zapisuje sie w bazie jako '"')
	    binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
	    
	    //ustalenie ktore pola maja byc sprawdzane przy bindowaniu, domyslnie wszystkie sprawdza
//	    binder.setAllowedFields(new String[] {"id", "imie", "nazwisko", "pesel", "dataurodzenia","tel_kom",
//	    		"tel_stacjonarny","ulica", "nrdomu"});
	}

	@Override
	protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors)
			throws Exception {
		
		
		ModelAndView mv;
		
		HashMap<String,Integer> h=MedcenterRequestUtil.checkButtonName(request);
		
		switch(h.get("param")){
		
		case MedcenterRequestUtil.ADD:{
			
			logger.info("wywolano przycisk dodaj adres");
				
			Map<Object,Object> model= errors.getModel();
				
			
			//inicjalizuje pusty obiekt Adres pacjentowi za każdym razem kiedy
			//kierowane jest zadanie dodania pustego adresu, niezaleznie od tego czy
			//pacjent jest zaciagniety z bazy czy dodawany w formularzu
			Adres ad=new Adres();
				
			((Pacjent)model.get("pacjent")).addAdres(ad);
				
			//wywoluje metode showForm - jesli zwrocony by zostal model metoda formBackingObject
			//zostalaby znow wywolana - skutkuje to "ulatywaniem" obiektu formularza z sesji
			return showForm(request, response, errors, model);
		}
		case MedcenterRequestUtil.DEL:{
			
			logger.info("wywolano przycisk usuń adres");
				
			Map<Object,Object> model= errors.getModel();
				
			Pacjent pa=((Pacjent)model.get("pacjent"));
			List<Adres> li=pa.getAdresy();
		
			logger.info("id jest "+h.get("id"));
			
			if(li.size()>0)
				li.remove(h.get("id").intValue());
					//li.remove(li.size()-1);

				return showForm(request, response, errors, model);
				
			
		}
		case MedcenterRequestUtil.SAVE:{
			Map<Object,Object> model= errors.getModel();
			Pacjent ptestowy=((Pacjent)model.get("pacjent"));
			List<Adres> lista=ptestowy.getAdresy();

				
			logger.info("wywolano metode doSubmitAction");
				
			//funkcja sprawdzajaca wszystkie pola pacjenta czy nie sa nullami - jesli tak, nie zapisuj
				
			bazapacjentow.savePacjent(ptestowy);			
				
			//po zapisaniu w bazie pacjent ma id nawet jesli jest to nowy obiekt - po zapisaniu w bazie
			//staje sie on obiektem ulotnym, zachowujacym wszystkie wlasciwosci obiektu trwalego
				
			mv=new ModelAndView(getSuccessView()+"?id="+ptestowy.getId());
			return mv;
		}
		default:{
			logger.info("Nieprawidlowe zadanie");
			
			mv=new ModelAndView("error");
			
			return mv;
		}
		
		}
		
		
	}
	
	public IBazaPacjentow getBazapacjentow() {
		return bazapacjentow;
	}

	public void setBazapacjentow(IBazaPacjentow bazapacjentow) {
		this.bazapacjentow = bazapacjentow;
	}
	
	public ResourceBundleMessageSource getMessagesource() {
		return messagesource;
	}

	public void setMessagesource(ResourceBundleMessageSource messagesource) {
		this.messagesource = messagesource;
	}

	
}
